<?php

namespace app\api\controller;

use app\common\controller\Api;
use app\common\library\AlipayFundService;
use app\common\model\WechatChapterOrder;
use think\Log;
/**
 * 免押接口
 */
class AlipayChapter extends Api
{
    protected $noNeedLogin = ['chapterNotify','unfreeze_notify','pay_notify'];
    protected $noNeedRight = '*';

    public function _initialize()
    {
        parent::_initialize();
    }

    /**
     * 获得免押参数
    */
    public function getChapterCode(){


//        $param = $this->request->param();
//        $allowOrderType = [
//            Pay::ORDER_TYPE_YUE,//用户余额充值订单
//            Pay::ORDER_TYPE_YAJIN,//租赁订单押金支付
//            Pay::ORDER_TYPE_ZULINFEIYONG,//租赁订单租赁费用支付
//        ];
//        $allowOrderType = join(',', $allowOrderType);
//        $rule = [
//            ['order_id', 'require|>:0', '请填写订单id|订单id必须是大于0的数字'],
//            ['order_type', "require|in:{$allowOrderType}", '请填写订单类型|无效的订单类型'],
//            ['pay_type', 'require|in:wechat,alipay', '请填写支付类型|无效的支付类型']
//        ];
//        $check = $this->validate($param, $rule);
//        if ($check !== true) {
//            $this->error($check);
//        }
//        Db::startTrans();
//        try {
//
//            Db::commit();
//        } catch (Exception $e) {
//            Db::rollback();
//            $this->error($e->getMessage());
//        }
//        $this->success('获取支付代码成功');
    }

    /**
     * 支付宝授权免押成功后回调()
     *  务必要将auth_no 存储到表中,后面解冻订单时需要用到
     */
    public function chapterNotify()
    {
        trace("========================支付宝授权免押成功后回调==============================");
        // 1. 使用 post(false) 获取最原始、最纯净的POST数组
        $postData = $this->request->post(false);
        trace('支付宝免押授权回调数据:');
        trace($postData);
        // 检查是否获取到数据，以防万一
        if (empty($postData)) {
            trace('接收到空的回调请求');
            echo "failure";
            return;
        }
        try {
            // 2. 调用服务类进行验签 (传入这个纯净的数组)
            $verifyResult = AlipayFundService::verifyNotify($postData);
            trace('打印验签结果');
            trace($verifyResult);
            if ($verifyResult) {
                // 验签成功
                Log::record('验签成功', 'info');

                // 3. 处理业务逻辑 (保持不变)
                //if (isset($postData['auth_status']) && $postData['auth_status'] == 'SUCCESS') {
                    $outOrderNo = $postData['out_order_no'];
                    $wechatChapterOrderInfo = WechatChapterOrder::get(['out_order_no' => $outOrderNo]);
                    if($wechatChapterOrderInfo){
                        $wechatChapterOrderInfo->auth_no = $postData['auth_no'];
                        $wechatChapterOrderInfo->alipay_amount = $postData['amount'];
                        $wechatChapterOrderInfo->save();
                    }
                    WechatChapterOrder::authorizeSuccess($outOrderNo);
                //}
                // 4. 输出 success (保持不变)
                echo "success";

            } else {
                // 验签失败
                Log::record('验签失败，请检查配置或数据来源', 'error');
                echo "failure";
            }

        } catch (\Exception $e) {
            Log::record('验签或业务处理异常：' . $e->getMessage(), 'error');
            echo "failure";
        }
        return;
    }


    /**
     * 支付宝解冻免押订单成功后回调(貌似没回调,一直没被调用)
     *
     */
    public function unfreeze_notify()
    {
        trace("========================支付宝解冻免押订单成功后回调==============================");

        // 1. 使用 post(false) 获取最原始、最纯净的POST数组
        $postData = $this->request->post(false);
        trace('支付宝解冻免押订单成功后回调:');
        trace($postData);
        // 检查是否获取到数据，以防万一
        if (empty($postData)) {
            trace('接收到空的回调请求');
            echo "failure";
            return;
        }

        try {
            // 2. 调用服务类进行验签 (传入这个纯净的数组)
            $verifyResult = AlipayFundService::verifyNotify($postData);
            trace('打印验签结果');
            trace($verifyResult);
            if ($verifyResult) {
                // 验签成功
                Log::record('验签成功', 'info');

                // 3. 处理业务逻辑 (保持不变)
                if (isset($postData['auth_status']) && $postData['auth_status'] == 'SUCCESS') {
                    // ... 您的数据库操作 ...
                }

                // 4. 输出 success (保持不变)
                echo "success";

            } else {
                // 验签失败
                Log::record('验签失败，请检查配置或数据来源', 'error');
                echo "failure";
            }

        } catch (\Exception $e) {
            Log::record('验签或业务处理异常：' . $e->getMessage(), 'error');
            echo "failure";
        }
        return;
    }


    /**
     * 支付宝免押扣款回调
     *
     */
    public function pay_notify()
    {
        trace("========================支付宝免押扣款回调==============================");

        // 1. 使用 post(false) 获取最原始、最纯净的POST数组
        $postData = $this->request->post(false);
        trace('支付宝免押扣款回调:');
        trace($postData);
        // 检查是否获取到数据，以防万一
        if (empty($postData)) {
            trace('接收到空的回调请求');
            echo "failure";
            return;
        }

        try {
            // 2. 调用服务类进行验签 (传入这个纯净的数组)
            $verifyResult = AlipayFundService::verifyNotify($postData);
            trace('打印验签结果');
            trace($verifyResult);
            if ($verifyResult) {
                // 验签成功
                Log::record('验签成功', 'info');

                // 3. 处理业务逻辑 (保持不变)
                if (isset($postData['auth_status']) && $postData['auth_status'] == 'SUCCESS') {
                    // ... 您的数据库操作 ...
                }

                // 4. 输出 success (保持不变)
                echo "success";

            } else {
                // 验签失败
                Log::record('验签失败，请检查配置或数据来源', 'error');
                echo "failure";
            }

        } catch (\Exception $e) {
            Log::record('验签或业务处理异常：' . $e->getMessage(), 'error');
            echo "failure";
        }
        return;
    }




}
